package persistence

import (
	"fmt"

	"baseService/internal/domain/entities"
	"baseService/internal/pkg/logger"

	"gorm.io/gorm"
)

// MigrationManager 数据库迁移管理器
type MigrationManager struct {
	db     *gorm.DB
	logger logger.Logger
}

// NewMigrationManager 创建迁移管理器
func NewMigrationManager(db *gorm.DB, logger logger.Logger) *MigrationManager {
	return &MigrationManager{
		db:     db,
		logger: logger,
	}
}

// AutoMigrate 执行自动迁移
func (mm *MigrationManager) AutoMigrate() error {
	mm.logger.Info("开始执行数据库自动迁移...")

	// 定义需要迁移的示例实体模型
	models := []interface{}{
		&entities.Example{}, // 示例表 - 演示GORM和BaseEntity的使用
		&entities.User{},    // 用户表
		// 在这里添加你的业务实体：
		// &entities.Article{},  // 文章表
		// &entities.Category{}, // 分类表
	}

	// 执行自动迁移 - GORM 会根据结构体标签自动创建表、索引、约束等
	for _, model := range models {
		if err := mm.db.AutoMigrate(model); err != nil {
			tableName := mm.getTableName(model)
			mm.logger.Error("数据表迁移失败 - table: " + tableName + ", error: " + err.Error())
			return fmt.Errorf("迁移表 %s 失败: %w", tableName, err)
		}

		tableName := mm.getTableName(model)
		mm.logger.Info("数据表迁移成功 - table: " + tableName)
	}

	mm.logger.Info("数据库自动迁移完成")
	return nil
}

// getTableName 获取模型对应的表名
func (mm *MigrationManager) getTableName(model interface{}) string {
	// 通过 GORM 获取表名
	stmt := &gorm.Statement{DB: mm.db}
	stmt.Parse(model)
	return stmt.Schema.Table
}

// DropAllTables 删除所有表（谨慎使用，主要用于开发环境重置）
func (mm *MigrationManager) DropAllTables() error {
	mm.logger.Warn("开始删除所有数据表...")

	tables := []string{
		"users",    // 用户表
		"examples", // 示例表
		// 在这里添加你的业务表名（注意依赖关系，先删除依赖表）：
		// "user_articles", // 用户文章关联表
		// "articles",      // 文章表
	}

	// 按照依赖关系倒序删除表
	for _, table := range tables {
		if err := mm.db.Exec(fmt.Sprintf("DROP TABLE IF EXISTS %s", table)).Error; err != nil {
			mm.logger.Error("删除表失败 - table: " + table + ", error: " + err.Error())
			return fmt.Errorf("删除表 %s 失败: %w", table, err)
		}
		mm.logger.Info("表删除成功 - table: " + table)
	}

	mm.logger.Warn("所有数据表删除完成")
	return nil
}
